package com.yc.sole.framework.redis.utils;

import cn.hutool.core.util.ArrayUtil;
import org.springframework.core.StandardReflectionParameterNameDiscoverer;
import org.springframework.expression.EvaluationContext;
import org.springframework.expression.Expression;
import org.springframework.expression.ExpressionParser;
import org.springframework.expression.spel.standard.SpelExpressionParser;
import org.springframework.expression.spel.support.StandardEvaluationContext;

import java.lang.reflect.Method;
import java.util.Objects;

/**
 * spel工具类
 *
 * @author yizuomin
 * @date 2023/2/28 15:47
 **/
public class SpelUtil {
    private SpelUtil() {
    }

    /**
     * 解析 spel 表达式
     *
     * @param method    方法
     * @param arguments 参数
     * @param sPel      SPel表达式
     * @param clazz     clazz
     * @return 执行spel表达式后的结果
     */
    public static <T> T analyticalSPelExpression(Method method, Object[] arguments, String sPel, Class<T> clazz) {
        ExpressionParser parser = new SpelExpressionParser();
        StandardReflectionParameterNameDiscoverer discoverer = new StandardReflectionParameterNameDiscoverer();
        String[] params = discoverer.getParameterNames(method);
        EvaluationContext context = new StandardEvaluationContext();
        if (ArrayUtil.isEmpty(params)) {
            return null;
        }
        for (int i = 0; i < Objects.requireNonNull(params).length; i++) {
            context.setVariable(params[i], arguments[i]);
        }
        try {
            Expression expression = parser.parseExpression(sPel);
            return expression.getValue(context, clazz);
        } catch (Exception e) {
            return null;
        }
    }
}
